package br.com.rotaestatistica.daos;

import java.util.*;
import java.sql.Date;
import java.sql.*;
import java.util.ArrayList;

import br.com.rotaestatistica.entities.TrajetoEntity;
import br.com.rotaestatistica.utils.FabricaDeConexao;

public class TrajetoDAO {

	public List<TrajetoEntity> selectAllTrajetosAsList() {

		List<TrajetoEntity> list = new ArrayList<TrajetoEntity>();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		String SQL = "SELECT * FROM Trajeto";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);

			rs = pstm.executeQuery();
			while (rs.next()) {
				TrajetoEntity trajeto = new TrajetoEntity();

				trajeto.setId_Trajeto(rs.getLong("idtrajeto"));
				trajeto.setHorarioPartida(rs.getDate("horariopartida"));
				trajeto.setHorarioChegada(rs.getDate("horariochegada"));
				trajeto.setDuracao(rs.getInt("duracao"));
				trajeto.setId_EstacaoDePartida(rs.getLong("estacaodepartida"));
				trajeto.setId_EstacaoDeChegada(rs.getLong("estacaodechegada"));
				trajeto.setId_Lotacao(rs.getLong("id_lotacao"));
				trajeto.setId_UsuarioCadastrado(rs.getLong("id_usuariocadastrado"));

				list.add(trajeto);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public TrajetoEntity selectTrajetoById(long idTrajeto) {

		TrajetoEntity trajeto = new TrajetoEntity();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		String SQL = "SELECT * FROM Trajeto WHERE idTrajeto =?";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setLong(1, idTrajeto);
			
			rs = pstm.executeQuery();
			while (rs.next()) {
				trajeto.setId_Trajeto(rs.getLong("idtrajeto"));
				trajeto.setHorarioPartida(rs.getTimestamp("horariopartida"));
				trajeto.setHorarioChegada(rs.getTimestamp("horariochegada"));
				trajeto.setDuracao(rs.getInt("duracao"));
				trajeto.setId_EstacaoDePartida(rs.getLong("estacaodepartida"));
				trajeto.setId_EstacaoDeChegada(rs.getLong("estacaodechegada"));
				trajeto.setId_Lotacao(rs.getLong("id_lotacao"));
				trajeto.setId_Clima(rs.getLong("id_clima"));
				trajeto.setId_UsuarioCadastrado(rs.getLong("id_usuariocadastrado"));
			}
			return trajeto;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	public boolean insertTrajeto(TrajetoEntity trajeto) {

		PreparedStatement pstm = null;

		String SQL = "INSERT INTO trajeto (horarioPartida,horarioChegada,duracao,estacaoDePartida,estacaoDeChegada,id_Lotacao,id_Clima, id_UsuarioCadastrado) VALUES (?,?,?,?,?,?,?,?)";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setTimestamp(1, trajeto.getSQLHorarioPartida());
			pstm.setTimestamp(2, trajeto.getSQLHorarioChegada());
			pstm.setLong(3, trajeto.getDuracao());
			pstm.setLong(4, trajeto.getId_EstacaoDePartida());
			pstm.setLong(5, trajeto.getId_EstacaoDeChegada());
			pstm.setLong(6, trajeto.getId_Lotacao());
			pstm.setLong(7, trajeto.getId_Clima());
			pstm.setLong(8, trajeto.getId_UsuarioCadastrado());
			pstm.executeUpdate();
			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	public boolean deleteTrajetoById(long idTrajeto) {
		PreparedStatement pstm = null;

		String SQL = "DELETE FROM Trajeto WHERE idTrajeto =?";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setLong(1, idTrajeto);

			pstm.executeUpdate();

			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	public boolean updateTrajeto(TrajetoEntity trajeto) {

		PreparedStatement pstm = null;

		String SQL = "UPDATE Trajeto SET horarioPartida=?,horarioChegada=?,duracao=?,estacaoDePartida=?,estacaoDeChegada=?,id_Lotacao=?,id_Clima=?, id_usuarioCadastrado=? WHERE idTrajeto=?";

		try {
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
			pstm.setTimestamp(1, trajeto.getSQLHorarioPartida());
			pstm.setTimestamp(2, trajeto.getSQLHorarioChegada());
			pstm.setLong(3, trajeto.getDuracao());
			pstm.setLong(4, trajeto.getId_EstacaoDePartida());
			pstm.setLong(5, trajeto.getId_EstacaoDeChegada());
			pstm.setLong(6, trajeto.getId_Lotacao());
			pstm.setLong(7, trajeto.getId_Clima());
			pstm.setLong(8, trajeto.getId_Trajeto());
			pstm.setLong(9, trajeto.getId_UsuarioCadastrado());

			pstm.executeUpdate();

			return true;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

	public List<TrajetoEntity> selectTrajetosAsListWithFilters(
			long id_EstacaoPartida, long id_EstacaoDestino, long id_lotacao,
			long id_clima, int diaDaSemana) {

		List<TrajetoEntity> list = new ArrayList<TrajetoEntity>();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		try {
			String SQL=null;

			if (id_lotacao > 0 && id_clima > 0 && diaDaSemana != -1) {
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_lotacao=? AND id_clima=? AND (SELECT EXTRACT(DOW FROM horariopartida))=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_lotacao);
				pstm.setLong(4, id_clima);
				pstm.setInt(5, diaDaSemana);
			} else if (id_lotacao > 0 && id_clima > 0) {
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_lotacao=? AND id_clima=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_lotacao);
				pstm.setLong(4, id_clima);
			} else if (id_clima > 0 && diaDaSemana != -1) {
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_clima=? AND (SELECT EXTRACT(DOW FROM horariopartida))=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_clima);
				pstm.setInt(4, diaDaSemana);
			} else if(id_lotacao > 0 && diaDaSemana != -1) {
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_lotacao=? AND (SELECT EXTRACT(DOW FROM horariopartida))=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_lotacao);
				pstm.setInt(4, diaDaSemana);
			} else if(id_lotacao > 0){
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_lotacao=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_lotacao);
			} else if(id_clima > 0){
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND id_clima=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setLong(3, id_clima);
			} else if(diaDaSemana != -1){
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=? AND (SELECT EXTRACT(DOW FROM horariopartida))=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
				pstm.setInt(3, diaDaSemana);
			}
			else {
				SQL = "SELECT * FROM Trajeto WHERE estacaodepartida=? AND estacaodechegada=?";
				pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);
				pstm.setLong(1, id_EstacaoPartida);
				pstm.setLong(2, id_EstacaoDestino);
			}

			rs = pstm.executeQuery();
			while (rs.next()) {
				TrajetoEntity trajeto = new TrajetoEntity();
				trajeto.setId_Trajeto(rs.getLong("idtrajeto"));
				trajeto.setId_EstacaoDeChegada(rs.getLong("estacaodechegada"));
				trajeto.setId_EstacaoDePartida(rs.getLong("estacaodepartida"));
				trajeto.setId_Clima(rs.getLong("id_clima"));
				trajeto.setId_Lotacao(rs.getLong("id_lotacao"));
				trajeto.setDuracao(rs.getInt("duracao"));
				trajeto.setHorarioChegada(rs.getTimestamp("horariochegada"));
				trajeto.setHorarioPartida(rs.getTimestamp("horariopartida"));
				trajeto.setId_UsuarioCadastrado(rs.getLong("id_usuarioCadastrado"));
				list.add(trajeto);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}
	
	public List<TrajetoEntity> selectTrajetosAsListWithFiltersX(
			long id_EstacaoPartida, long id_EstacaoDestino, long id_lotacao,
			long id_clima, int diaDaSemana, Date ini, Date fim, int hourini, int hourfim) {

		List<TrajetoEntity> list = new ArrayList<TrajetoEntity>();
		PreparedStatement pstm = null;
		ResultSet rs = null;

		try {
			String SQL="SELECT * FROM Trajeto WHERE estacaodepartida="+id_EstacaoPartida+" AND estacaodechegada="+id_EstacaoDestino;

			if(id_lotacao < 0){
				SQL = SQL + " AND id_lotacao="+id_lotacao;
			}
			if(id_clima > 0){
				SQL = SQL + " AND id_clima="+id_clima;
			}
			if(diaDaSemana != -1){
				SQL = SQL + " AND (SELECT EXTRACT(DOW FROM horariopartida))="+diaDaSemana;
			}
			if(ini != null && fim != null){
				SQL = SQL + " AND (SELECT date(horariopartida)) BETWEEN '"+ini+"' AND '"+fim+"'";
			}
			if(hourini > 3 && hourini<25 && hourfim > 3 && hourfim<25 &&hourini<hourfim){
				SQL = SQL + " AND (SELECT EXTRACT(HOUR FROM horariopartida)) BETWEEN "+hourini+" AND "+hourfim;
			}
			pstm = FabricaDeConexao.getConexao().prepareStatement(SQL);

			rs = pstm.executeQuery();
			while (rs.next()) {
				TrajetoEntity trajeto = new TrajetoEntity();
				trajeto.setId_Trajeto(rs.getLong("idtrajeto"));
				trajeto.setId_EstacaoDeChegada(rs.getLong("estacaodechegada"));
				trajeto.setId_EstacaoDePartida(rs.getLong("estacaodepartida"));
				trajeto.setId_Clima(rs.getLong("id_clima"));
				trajeto.setId_Lotacao(rs.getLong("id_lotacao"));
				trajeto.setDuracao(rs.getInt("duracao"));
				trajeto.setHorarioChegada(rs.getTimestamp("horariochegada"));
				trajeto.setHorarioPartida(rs.getTimestamp("horariopartida"));
				trajeto.setId_UsuarioCadastrado(rs.getLong("id_usuarioCadastrado"));
				list.add(trajeto);
			}
			return list;
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		} finally {
			try {
				rs.close();
				pstm.close();
				FabricaDeConexao.fechaConexao();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}
